from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score
from sklearn.model_selection import ShuffleSplit
import pandas as pd
from sklearn.tree import export_graphviz
import graphviz
import matplotlib.pyplot as plt

# 读取数据文件
file_path = 'data.csv'  # 请替换为您的本地文件路径
data = pd.read_csv(file_path, encoding='utf-8-sig')
# 加载数据
X = data.drop(columns=['id', '洪水概率'])  # 假设 'id' 列名为 'id'，目标变量为 '洪水发生概率'
y = data['洪水概率']

# 创建随机森林分类器
# n_estimators=100：这是一个参数，指定随机森林中决策树的数量。
clf =RandomForestRegressor(n_estimators=200)

# 创建ShuffleSplit对象，用于执行自动洗牌
# n_splits=1：指定分割的次数。n_splits=1 表示将数据分割一次。
# train_size=0.7：训练集占整个数据集的比例。train_size=0.7 表示训练集占70%。
# test_size=0.3：测试集占整个数据集的比例。test_size=0.3 表示测试集占30%。
# random_state=0：随机种子，用于保证结果的可重复性。random_state=0 保证每次运行代码时得到的分割结果相同。
ss = ShuffleSplit(n_splits=1, train_size=0.7, test_size=0.3, random_state=0)
# 循环遍历每个拆分，并使用随机森林分类器对每个拆分进行训练和评估
for train_index, test_index in ss.split(X, y):
    X_train, X_test = X.iloc[train_index], X.iloc[test_index]
    y_train, y_test = y.iloc[train_index], y.iloc[test_index]
    clf.fit(X_train, y_train)
    y_pred = clf.predict(X_test)
    print("Confusion Matrix:")
    print(confusion_matrix(y_test, y_pred))  # 输出分类结果矩阵
    print("Classification Report:")
    print(classification_report(y_test, y_pred))  # 输出混淆矩阵
    print("Accuracy:")
    print(accuracy_score(y_test, y_pred))
    print(clf.predict(X_train))  # 此处用作预测，预测数据可以用另一个文件导入，格式与DataX相同
    print(clf.score(X_test, y_test))

importances = clf.feature_importances_  # 计算特征重要性
print(importances)
# 画条形图
plt.barh(range(len(importances)), importances)

# 添加标题
plt.title("Feature Importances")
feature_names = ['季风强度', '地形排水', '河流管理','森林砍伐','城市化','气候变化','大坝质量','淤积','农业实践','侵蚀','无效防灾','排水系统','海岸脆弱性','滑坡','流域', '基础设施恶化' , '人口得分','湿地损失','规划不足','政策因素']
# 添加特征名称
plt.yticks(range(len(importances)), feature_names)

# 显示图像
# plt.show()
plt.savefig('feature_importance.png')
# 使用 export_graphviz 函数将决策树保存为 dot 文件
dot_data = export_graphviz(clf.estimators_[0], out_file=None,
                           feature_names=feature_names)

# 使用 graphviz 库读取 dot 文件并生成决策树可视化图形
graph = graphviz.Source(dot_data)
graph.render('decision_tree')
